<?php
require_once 'BotModule.php';

/**
 * Модуль для бота, для отправки и получения текста, для pastebin.ru короче
 */
class Pastebin_BotModule extends BotModule {
    
    /**
     * Хост при отправке POST
     * 
     * @property string $host
     */
    private $host = 'pastebin.ru';
    
    /**
     * Путь при отправке POST
     * 
     * @property string $post_action
     */
    private $post_action = '/index.php';
    
    /**
     * Url отправленного текста
     * 
     * @property string $pastebin_url
     */
    private $pastebin_url = '';
    
    /**
     * Данные для POST
     * 
     * @property array $post_data
     */
    private $post_data = array(
        'parent_pid'     => '',
        'std-x'         => '1280',
        'std-y'         => '800',
        'poster'         => 'name',
        'paste'         => '%CE%F2%EF%F0%E0%E2%E8%F2%FC',
        'code2'         => 'text',
    );
    
    
    public function __construct() {
        parent::__construct();
        // pastebin p текст 
        //Вернёт ссылку и номер на текст
        $this->setCommand(array(
            'pattern' => 'pastebin p (.*)',
            'object'  => $this,
            'function_name' => 'commandPostText',
            'params' => array('$1')
        ));
        // pastebin g номер
        //Вернёт текст по номеру
        $this->setCommand(array(
            'pattern' => 'pastebin g (.*)',
            'object'  => $this,
            'function_name' => 'commandGetTextById',
            'params' => array('$1')
        ));
        // pastebin pc тектс
        //Вернёт ссылку и номер, в приват и в конфу на текст
        $this->setCommand(array(
            'pattern' => 'pastebin pc (.*)',
            'object'  => $this,
            'function_name' => 'commandPostTextAndReturnToConference',
            'params' => array('$1')
        ));
    }
    
    /**
     * Отправить текст и вывести юзеру id и url текста
     * 
     * @param string $text
     */
    public function commandPostText($text){
        $this->postText($text);
        
        $this->sendMessage('Отправлено. id: ' . $this->getId() . ' url: ' . $this->getUrl());
    }
    
    /**
     * Отправить текст и вывести юзеру id и url текста
     * 
     * @param string $text
     */
    public function commandPostTextAndReturnToConference($text){
        $this->commandPostText($text);
    }
    
    /**
     * Получить текст и отправить юзеру по id
     * 
     * @param int|string $id
     */
    public function commandGetTextById($id = null){
        $id = trim($id);
        if(is_numeric($id)){
            if(!is_null($text = $this->getTextById($id))){
                $this->sendMessage('id: ' . $id . ' text: ' . "\r\n". $text);
            } else {
                $this->sendMessage('Не найден! id: ' . $id . ' text: не найден!');
            }
        } else {
            $this->sendMessage('Укажите число!');
        }
    }
    
    /**
     * Получить текст по id
     * 
     * @param int|string $id
     * @return string
     */
    public function getTextById($id){
        $content = file_get_contents('http://'.$this->host.'/'.$id);

        $matches = array();
        
        $pattern = '/'
        . preg_quote('<textarea id="code" class="codeedit" name="code2" cols="80" rows="10" onkeydown="checkTab(this)">', "/")
        . '(.*)'
        . preg_quote('</textarea>', "/")
        . '/si';
        
        if(preg_match($pattern, $content, $matches) == 0){
            // ошибка
        }
        
        $text = trim(html_entity_decode ($matches[1], ENT_QUOTES));
        
        if($text == ''){
            return null;
        } else {
            return $text;
        }
    }
    
    /**
     * Получить url отправленного текста
     * 
     * @return string
     */
    public function getUrl(){
        return $this->pastebin_url;
    }
    
    /**
     * Получить id отправленного текста
     * 
     * @return int
     */
    public function getId(){
        return substr(parse_url($this->pastebin_url, intval(PHP_URL_PATH)), 1);
    }
    
    /**
     * Объвить текст-код в передаваемый POST
     * 
     * @param string $text
     */public function setPostText($text){
        $this->post_data['code2'] = iconv("utf-8", 'cp1251', $text);
    }
    
    /**
     * Отправить текст-код на pastebin
     * 
     * @param string $text
     */
    public function postText($text){
        // объявляем текст в post_data
        $this->setPostText($text);
        
        // создаём контекст, и подготавливаем post_data
        $context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => "Content-Type: application/x-www-form-urlencoded",
                'content' => http_build_query($this->post_data),
            )
        ));
        
        // открываем соединение и передаём контекст
        $handel = fopen('http://'.$this->host.$this->post_action, 'r', false, $context);
        
        $url = null;
        
        // получаем заголовки из ответа
        $meta_data = stream_get_meta_data($handel);
        foreach($meta_data['wrapper_data'] as $response) {
            /* Were we redirected? */
            $response = strtolower($response);
              if (strpos($response, 'location:') === 0) {
                /* update $url with where we were redirected to */
                $url = trim(str_replace('location:', '', $response));
            }
        }
        //var_dump($meta_data);
        fclose($handel);
        $this->pastebin_url = $url;
    }
}
